#ifndef PROGRESSLISTENER_H
#define PROGRESSLISTENER_H

#include "ifilebuffer.h"

#include <QObject>
#include <QTimer>
#include <QThreadPool>
#include <QElapsedTimer>
#include <QMutex>
#include <QWaitCondition>

class ProgressListener : public QObject, public QRunnable
{
    Q_OBJECT
public:
    ProgressListener(IFileBuffer *fb, int msecInt);
    ~ProgressListener();

    class ShortInfo
    {
    public:
        ShortInfo(): bytesProcessed(0), timeElapsed(0) {}
        //! Обработанное количетсво байт после запуска процесса
        qint64 bytesProcessed;
        //! Количество миллисекунд, прошедшее после запуска процесса
        qint64 timeElapsed;
    };

    class Info : public ShortInfo
    {
    public:

        Info() :
            progressVal(0), curSpeed(0), avgSpeed(0), bytesRemaining(0),
            timeRemaining(0) {}

        //! Процент от выполнения (число в интервале [0, 100])
        int progressVal;
        //! Текущая (за период последнего опроса) скорость операции (байты в миллисекунду)
        double curSpeed;
        //! Средняя (за время с начала операции) скорость операции (байты в миллисекунду)
        double avgSpeed;
        //! Оставшееся количество байт для обработки
        qint64 bytesRemaining;
        //! Оставшееся время для завершения операции (на основании расчета по средней скорости)
        qint64 timeRemaining;

        //! Рассчитывает значения параметров операции на основании предыдущих значений и
        void compute(qint64 bytesProcessed, qint64 totalBytes, qint64 timeElapsed, ShortInfo *predInfo);
    };   

signals:

    //! Сигнал, содержайщий обновленную информацию о прогрессе файловой операции. Подается в процессе.
    void updateInfo(ProgressListener::Info status);

public slots:
    //! Должен вызываться при начале операций с файлами
    void onBeginOp(qint64 fileSize);
    //! Должен вызываться при окончании операций с файлами
    void onEndOp();
    void scheduleWork();
//    void disableWork();

protected:
    IFileBuffer *fb;
    QTimer *timer;
    QThreadPool worker;
    QElapsedTimer elapsedTimer;
    double fileSize;
    void run();
    ShortInfo predInfo;

//    QMutex workGuard;
//    bool workEnabled;
//    void enableWork();
};

#endif // PROGRESSLISTENER_H
